package com.javaweb.service.impl;

import com.javaweb.common.BusinessConstants;
import com.javaweb.dao.ArticleDao;
import com.javaweb.dao.UserDao;
import com.javaweb.model.Article;
import com.javaweb.service.ArticleService;
import com.javaweb.service.dto.ArticleConditionDto;
import com.javaweb.service.dto.ArticleUpdateDto;
import com.javaweb.service.dto.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


@Service
@Slf4j
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private UserDao userDao ;

    @Autowired
    private ArticleDao articleDao ;

    @Override
    public PageResult queryByArticleCondition(ArticleConditionDto articleCond, Integer pageNum, Integer pageSize) {
        // 检查输入参数
        if (pageNum == null || pageSize == null || pageNum < 1 || pageSize < 1) {
            throw new IllegalArgumentException("Invalid page number or page size");
        }

        // 获取符合条件的文章总数
        int total = articleDao.countByConditions(articleCond);

        // 计算分页起始位置
        int fromIndex = (pageNum - 1) * pageSize;
        List<Article> articles = articleDao.selectByConditions(articleCond, fromIndex, pageSize);

        // 创建 PageResult 对象并返回
        PageResult<Article> pageResult = new PageResult<>();
        pageResult.setData(articles);
        pageResult.setPageNum(pageNum);
        pageResult.setPageSize(pageSize);
        pageResult.setTotal(total);

        return pageResult;
    }

    @Override
    public Article queryById(String articleId) {
        // 检查输入参数
        if (articleId == null || articleId.isEmpty()) {
            throw new IllegalArgumentException("articleId not is null or empty");
        }

        // 调用 DAO 层的方法获取文章
        Article article = articleDao.selectById(articleId);

        // 检查是否找到文章
        if (article == null) {
            log.warn("Article not found for articleId: " + articleId);
        }

        return article; // 返回查询结果
    }

    @Override
    public Article insertArticle(Article article) {
        articleDao.insert(article);
        return article;//返回带有新增id的article。
    }

    @Transactional
    @Override
    public int publishArticle(String articelId, String userId) {
        // 更新文章状态，将其从默认的0改为1（表示发布）
        Integer updateStatusResult = articleDao.updateStatus(Integer.valueOf(articelId), BusinessConstants.ARTICLE_PUBLISHED);

        // 检查文章状态更新是否成功
        if (updateStatusResult <= 0) {
            log.error("文章状态更新失败" + articelId);
            return 0; // 返回0表示发布失败
        }

        // 更新用户积分
        Integer updateScoreResult = userDao.updateScore(Integer.valueOf(userId), BusinessConstants.ARTICLE_SCORE);

        // 检查用户积分更新是否成功
        if (updateScoreResult <= 0) {
            log.error("用户积分更新失败 " + userId);
            throw new RuntimeException("用户积分更新失败"); // 抛出异常以回滚事务
        }

        log.info("文章" + articelId + "发布成功");
        return 1; // 返回1表示发布成功
    }

    @Transactional
    @Override
    public int publishArticlesByBatch(String[] articleIds, String userId) {
        // 检查输入
        if (articleIds == null || articleIds.length == 0 || userId == null) {
            return 0; // 如果参数无效，直接返回0
        }
        int successfulUpdates = 0; // 记录成功发布的文章数量
        for (String articleId : articleIds) {
            // 更新文章状态
            Integer ret = articleDao.updateStatus(Integer.valueOf(articleId), BusinessConstants.ARTICLE_PUBLISHED);
            if (ret > 0) {
                // 如果状态更新成功，更新用户积分
                ret = userDao.updateScore(Integer.valueOf(userId), BusinessConstants.ARTICLE_SCORE);
                if (ret > 0) {
                    successfulUpdates++; // 计数成功发布的文章
                } else {
                    log.error("用户积分更新失败" + articleId);
                    throw new RuntimeException("用户积分更新失败"); // 如果积分更新失败，抛出异常
                }
            } else {
                log.error("文章状态更新失败 " + articleId);
                throw new RuntimeException("文章状态更新失败"); // 如果状态更新失败，抛出异常
            }
        }
        // 如果所有文章都成功发布，则返回1
        return successfulUpdates == articleIds.length ? 1 : 0;
    }

    @Transactional
    @Override
    public int updateArticle(ArticleUpdateDto articledto) {
        // 检查 ArticleUpdateDto 是否有效
        if (articledto.getId() == null || articledto.getTitle() == null) {
            return 0; // 表示失败
        }

        // 将 ArticleUpdateDto 转换为 Article 对象
        Article article = new Article();
        article.setId(Integer.valueOf(articledto.getId()));
        article.setTitle(articledto.getTitle());
        article.setContent(articledto.getContent());
        article.setDescription(articledto.getDescription());
        article.setCategoryId(Integer.valueOf(articledto.getCategoryId()));
        article.setStatus(Integer.valueOf(articledto.getStatus()));

        // 调用 ArticleDao 的更新方法
        return articleDao.updatearticle(article);
    }

    @Transactional
    @Override
    public int removeArticle(String articleId, String userId) {
        //删除文章
        int deletearticleret=articleDao.deleteById(Integer.parseInt(articleId));
        if (deletearticleret<0){
            log.error("文章删除失败" + articleId);
            return 0; // 返回0表示发布失败
        }
        // 更新用户积分
        Integer updateScoreResult = userDao.updateScore(Integer.valueOf(userId), BusinessConstants.DELETE_ARTICLE_SCORE);
        // 检查用户积分更新是否成功
        if (updateScoreResult <= 0) {
            log.error("用户积分更新失败 " + userId);
            throw new RuntimeException("用户积分更新失败"); // 抛出异常以回滚事务
        }
        log.info("文章删除成功" + articleId);
        return 1; // 返回1表示发布成功
    }
}
